package com.jason.shader.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;

import com.jason.shader.R;

/**
 * desc: 给图片上色
 * user:jason
 * date:16-9-6
 * time:下午5:55
 */
public class DreamEffectView4 extends View {

    private Paint mBitmapPaint; // 位图画笔
    private Bitmap mBitmap; // 位图
    private PorterDuffXfermode mXfermode; // 图形混合模式
    private int x, y; // 位图起点
    private int screenW, screenH; // 屏幕宽高

    private Paint mShaderPaint; // shader图形画笔


    public DreamEffectView4(Context context, AttributeSet attrs) {
        super(context, attrs);

        initRes();

    }

    private void initRes() {

        // 获取位图
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.gril);

        // 混合模式
        mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SCREEN);

        screenW = getResources().getDisplayMetrics().widthPixels;
        screenH = getResources().getDisplayMetrics().heightPixels;

        x = screenW / 2 - mBitmap.getWidth() / 2;
        y = screenH / 2 - mBitmap.getHeight() / 2;

        mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        // 去饱和、提亮、色相矫正
        mBitmapPaint.setColorFilter(new ColorMatrixColorFilter(new float[]
                { 0.8587F, 0.2940F, -0.0927F, 0, 6.79F, 0.0821F, 0.9145F,
                        0.0634F, 0, 6.79F, 0.2019F, 0.1097F, 0.7483F,
                        0, 6.79F, 0, 0, 0, 1, 0 }));

        /**
         *  整张图片没重点，我们可以模拟单反相机的暗角效果，压暗图片周围的颜色亮度提亮中心，让整张图片的中心突出来！实现方式有很多种，
         *  比如1/4我们提到过的BlurMsakFilter向内模糊就可以得到一个类似的效果，
         *  但是BlurMsakFilter计算出来的像素太生硬毫无生气，这里我们就使用RadialGradient来模拟
         */

        // 实例化Shader图形画笔
        mShaderPaint = new Paint();

        // 设置径向渐变,渐变中心当然是图片的中心也是屏幕的中心 渐变半径我们直接拿图片的高度但是要稍微小点
        // 中心颜色为透明而边缘颜色为黑色
        mShaderPaint.setShader(new RadialGradient(screenW / 2, screenH / 2,
                mBitmap.getHeight() * 7 / 8, Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP));




    }


    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);

        // 新建图层
        int sc = canvas.saveLayer(x, y, x + mBitmap.getWidth(),
                y + mBitmap.getHeight(), null, Canvas.ALL_SAVE_FLAG);

        // 绘制混合颜色
        canvas.drawColor(0xcc1c093e);

        mBitmapPaint.setXfermode(mXfermode);
        canvas.drawBitmap(mBitmap, x, y, mBitmapPaint);

        // 还原混合模式
        mBitmapPaint.setXfermode(null);

        // 还原画布
        canvas.restoreToCount(sc);

        // 绘制一个跟图片大小一样的矩形
        canvas.drawRect(x,y,x + mBitmap.getWidth(), y + mBitmap.getHeight(), mShaderPaint);

    }
}
